#include <input_manager.h>
#include <termios.h>
#include <unistd.h>
#include <stdio.h>



//  * 函数名称： StdinDevInit
//  * 功能描述： 标准输入模块的设备初始化函数,用于设置标准输入的属性,
//  *            比如默认的标准输入是接收到回车换行符时才返回数据,
//  *            在本程序里把它改为"接收到任意一个字符即返回数据"
//  * 输入参数： 无
//  * 输出参数： 无
//  * 返 回 值： 0 - 成功, 其他值 - 失败
static int StdinDevInit(void)
{
    struct termios tTTyState;

    //先获得终端的状态
    tcgetattr(STDIN_FILENO, &tTTyState);

    //关闭内核模块
    tTTyState.c_lflag &= ~ICANON;

    //只要获得数据就返回
    tTTyState.c_cc[VMIN] = 1;

    //设置内核属性
    tcsetattr(STDIN_FILENO, TCSANOW, &tTTyState);
    return 0;
}


//  * 函数名称： StdinDevExit
//  * 功能描述： 标准输入模块的设备退出函数,恢复标准输入的原来属性
//  * 输入参数： 无
//  * 输出参数： 无
//  * 返 回 值： 0 - 成功, 其他值 - 失败
static int StdinDevExit(void)
{
    struct termios tTTyState;

    //先获得终端的状态
    tcgetattr(STDIN_FILENO, &tTTyState);

    //关闭内核模块
    tTTyState.c_lflag |= ICANON;


    //设置内核属性
    tcsetattr(STDIN_FILENO, TCSANOW, &tTTyState);
    return 0;
}

//  * 函数名称： StdinGetInputEvent
//  * 功能描述： 标准输入模块的读取数据函数,它在标准输入模块的子线程中被调用
//  * 输入参数： 无
//  * 输出参数： ptInputEvent - 内含得到的输入数据
//  * 返 回 值： 0 - 成功, 其他值 - 失败
static int StdinGetInputEvent(PT_InputEvent ptInputEvent)
{
    //有数据就读取，处理，返回，没有就立刻返回，不等待
    char c;

    ptInputEvent->iType = INPUT_TYPE_STDIN;
    c = fgetc(stdin);
    (void)c;
    gettimeofday(&ptInputEvent->tTime, NULL);

#if 0
        if(c == 'u')    //等于上扳
        {
            ptInputEvent->iVal = INPUT_VALUE_UP;
        }
        else if(c == 'n')   //下扳
        {
            ptInputEvent->iVal = INPUT_VALUE_DOWN;
        }
        else if(c == 'q')   //退出
        {
            ptInputEvent->iVal = INPUT_VALUE_EXIT;
        }
        else{
            //输入其他值
            ptInputEvent->iVal = INPUT_VALUE_UNKNOWN;
        }
#endif
    return 0;
}


static T_InputOpr g_tstdinOpr = {
    .name = "stdin",
    .DeviceInit = StdinDevInit,
    .DeviceExit = StdinDevExit,
    .GetInputEvent = StdinGetInputEvent,
};


//  * 函数名称： StdinInit
//  * 功能描述： 注册"标准输入模块"
//  * 输入参数： 无
//  * 输出参数： 无
//  * 返 回 值： 0 - 成功, 其他值 - 失败
int StdinInit(void)
{
    return RegisterInputOpr(&g_tstdinOpr);
}